package com.lap.mybatis.starter.processor;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.List;

/**
 * 批量操作,主要提供代理使用。
 *
 * @author Shuisheng.Lao
 * @version 0.0.1
 */
public record MybatisHelper(SqlSessionFactory sqlSessionFactory) {
  /**
   * 执行批量操作,单个对象操作。
   *
   * @param statementId mapper id
   * @param dataList 数据集合
   * @param commitQuantity 提交数量
   * @return 变更数量
   */
  public int executeBatch(String statementId, List<Object> dataList, int commitQuantity) {
    if (CollectionUtils.isEmpty(dataList)) {
      return 0;
    }

    try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
      List<List<Object>> partition = ListUtils.partition(dataList, commitQuantity);

      partition.forEach(
          item -> {
            session.insert(statementId, item);
            session.flushStatements();
            session.clearCache();
          });

      /*
       * 这里是否需要提交呢？还是外面一起提交
       */
      session.commit();
      return dataList.size();
    }
  }
}
